Python创建二维数组(关于list的一个小坑) 您所在的位置:网站首页 python 矩阵创建 Python创建二维数组(关于list的一个小坑)

Python创建二维数组(关于list的一个小坑)

2023-03-23 12:58| 来源: 网络整理| 查看: 265

0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题

今天写Python代码的时候遇到了一个大坑,差点就耽误我交作业了。。。 问题是这样的,我需要创建一个二维数组,如下:

m = n = 3 test = [[0] * m] * n print("test =", test)

输出结果如下:

test = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

是不是看起来没有一点问题? 一开始我也是这么觉得的,以为是我其他地方用错了什么函数,结果这么一试:

m = n = 3 test = [[0] * m] * n print("test =", test) test[0][0] = 233 print("test =", test)

输出结果如下:

test = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] test = [[233, 0, 0], [233, 0, 0], [233, 0, 0]]

是不是很惊讶?! 这个问题真的是折磨我一个中午,去网上一搜,官方文档中给出的说明是这样的:

Note also that the copies are shallow; nested structures are not copied. This often haunts new Python programmers; consider:

>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]

What has happened is that [[]] is a one-element list containing an empty list, so all three elements of [[]] * 3 are (pointers to) this single empty list. Modifying any of the elements of lists modifies this single list. You can create a list of different lists this way:

>>> >>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]

也就是说matrix = [array] * 3操作中,只是创建3个指向array的引用,所以一旦array改变,matrix中3个list也会随之改变。

2.创建二维数组的办法 2.1 直接创建法 test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]

简单粗暴,不过太麻烦,一般不用。

2.2 列表生成式法 test = [[0 for i in range(m)] for j in range(n)]

学会使用列表生成式,终生受益。不会的可以去列表生成式 - 廖雪峰的官方网站学习。

2.3 使用模块numpy创建 import numpy as np test = np.zeros((m, n), dtype=np.int)

关于模块numpy.zeros的更多知识,可以去numpy.zeros(np.zeros)使用方法--python学习笔记31看看。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有